import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class question_49 {
}
class Solution_49 {
//    public String cg(String s){
//        char arr[]=new char[26];
//        int err[]=new int [26];//用来统计每个字母的数量
//        for (int i = 0; i < arr.length; i++) {
//            arr[i]='0';
//        }
//        for (int i = 0; i < s.length(); i++) {
//            int temp=s.charAt(i)-'a';
//            arr[temp]=s.charAt(i);
//            err[temp]++;
//        }
//        String rs="";
//        for (int i = 0; i < arr.length; i++) {
//            if(arr[i]!='0'){
//                for (int j = 0; j < err[i]; j++) {
//                    rs+=String.valueOf(arr[i]);
//                }
//            }
//        }
//        return rs;
//    }
    /////////////法一，自己写比较和转化函数///////////////////////////////////////

//    public boolean cg2(String a,String b){
//        //考虑空字符串的问题
//        if(a.equals("")&&b.equals(""))
//            return true;
//        if(a.equals("")^b.equals(""))//^逻辑亦或符号，表示两个一个true一个false时成立，整体才为true
//            return false;
//        int la=a.length();
//        int lb=b.length();
//        if(la!=lb)//如果长度不同就直接退出比较了
//            return false;
//        int asum[]=new int[26];//用于存放每个字符对应的数量
//        int bsum[]=new int[26];
//        for (int i = 0; i < la; i++) {
//            int temp1=a.charAt(i)-'a';
//            asum[temp1]++;
//            int temp2=b.charAt(i)-'a';
//            bsum[temp2]++;
//        }
//        int i=0;
//        for (i = 0; i < asum.length; i++) {
//            if(asum[i]!=bsum[i]){ return false;}
//        }
//        return true;
//    }
//    public List<List<String>> groupAnagrams(String[] strs) {
//        if(strs==null||strs.length==0){
//            List<List<String>> l=new ArrayList<>();
//            List<String> lchild=new ArrayList<>();
//            l.add(lchild);
//            return l;
//        }
//        List<List<String>> l=new ArrayList<>();
//        List<String> temp=new ArrayList<>();
//        temp.add(strs[0]);
//        l.add(temp);
//        for (int i = 1; i < strs.length; i++) {
//            int sum=0;
//            for (int j = 0; j < l.size(); j++) {
//                if(cg2(strs[i],l.get(j).get(0))){
//                    l.get(j).add(strs[i]);
//                    sum++;
//                    break;
//                }
//            }
//            if(sum==0){//说明没有找到相同的，所以就得重新创建一个新的集合
//                temp=new ArrayList<String>();
//                temp.add(strs[i]);
//                l.add(temp);
//            }
//        }
//        return l;
//    }
//
    //////////////////通过直接使用java中的工具类，hashmap等类提高效率////////////////////////
    /* 法2.1
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, ArrayList<String>> result=new HashMap<>();
        for(String s:strs){//增强for循环
            //先将每一个s转化成字符数组，将字符数组进行排序，排序之后再转化成字符串作为key值进行查找
            char temp[]=s.toCharArray();
            Arrays.sort(temp);
            String key=new String(temp);
            if(!result.containsKey(key)){
                result.put(key,new ArrayList<String>());//没有则在hashmap中创建一个新的节点
            }
            result.get(key).add(s);
        }
        return new ArrayList(result.values());

    }
    */
    //法2.2，将每个字母对应的字母的数量作为区别的key的标志，如下
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, ArrayList<String>> resule=new HashMap<>();
        for(String s:strs){
            int sum[]=new int[26];//用来存储每个string对应的字母的数量
            for(char c:s.toCharArray()){
                int temp=c-'a';
                sum[temp]++;
            }
            StringBuffer sb=new StringBuffer();
            for(int temp:sum){
                sb.append("#");
                sb.append(temp);
            }
            String key=sb.toString();
            if(!resule.containsKey(key)){
                resule.put(key,new ArrayList<String>());
            }
            resule.get(key).add(s);
        }
        return new ArrayList(resule.values());
    }

}
